認証ポリシーのMFAに関するパラメータを試してみた #SnowflakeDB

認証ポリシーのMFAに関するパラメータを試してみた #SnowflakeDB

Clock Icon2024.10.02

はじめに

Snowflake では認証ポリシーというポリシーを定義できます。認証ポリシーを適用することでネットワークポリシーの次の段階として特定のクライアントや認証方式からのアクセスを許可するような制御が可能となります(2024年4月に一般提供)。

https://docs.snowflake.com/en/release-notes/2024/8_17#security-updates

2024年7月のアップデートで、MFA による認証の強化ということで、認証ポリシーに MFA に関する以下のパラメータが追加されました。

  • MFA_AUTHENTICATION_METHODS
  • MFA_ENROLLMENT

これによりログイン時に多要素認証(MFA)を強制する認証方法を指定できるのですが、IdP 側の設定とどのように関わるのかすぐわからなかったため、試してみて記事としました。

https://docs.snowflake.com/en/release-notes/2024/8_24#security-updates
https://docs.snowflake.com/en/user-guide/authentication-policies#label-authentication-policy-hardening-authentication

結論

先に結論ですが、認証ポリシーによる多要素認証(MFA)とは、Snowflake に統合済みの機能として提供される Duo Security サービスを指します。ポリシーの設定によって、各認証時に Duo による MFA を適用するかを制御できます。

事前準備

検証環境

  • Snowflake:AWS、Tokyoリージョン、Enterpriseエディション
  • Okta:Okta Developer を使用

Okta との SAML 連携

Snowflake と Okta との SAML 連携については以下に詳しく記載があります。

https://community.snowflake.com/s/article/How-To-Setup-SSO-Using-Okta-with-Snowflake-new-URL-format

Okta 側でアプリケーションを作成・必要な値を取得後、Snowflake 側で以下のコマンドを実行し
SAML2 セキュリティ統合を作成しました。

--統合オブジェクトの作成にはデフォルトでACCOUNTADMINでの操作が必要
USE ROLE ACCOUNTADMIN;

CREATE SECURITY INTEGRATION OKTAINTEGRATION
TYPE = SAML2 
ENABLED = TRUE 
SAML2_ISSUER = '<ENTITY ID>' 
SAML2_SSO_URL = '<IDP SSO URL>' 
SAML2_PROVIDER = 'OKTA' 
SAML2_X509_CERT='<Authentication Certificate value>' 
SAML2_SP_INITIATED_LOGIN_PAGE_LABEL = 'OKTA SSO'
SAML2_ENABLE_SP_INITIATED = TRUE
SAML2_SNOWFLAKE_ACS_URL = '<Snowflake URL>/fed/login'
SAML2_SNOWFLAKE_ISSUER_URL = '<Snowflake URL>';

ログイン時の注意点として、 Okta から Snowflake に渡される NameID の値が、Snowflake ユーザーのLOGIN_NAME と一致しないとログインに失敗します。

Okta 側の認証ポリシーを確認

あわせて Okta 側の認証ポリシーを確認しておきます。ここでは下図の通りパスワードと追加の要素(Okta Verify)による認証ポリシーをアプリケーション(Snowflake)に設定しています。

image

ログインしてみる

統合オブジェクト作成時にENABLED = TRUE としているのでオブジェクト作成後、再度 Snowflake ログインしようとすると Okta 経由でログインするための項目が追加されます。

image 1

Okta 経由でサインインする場合、Okta にサインインしていなければ Okta 側の認証ポリシーに従いパスワードによるサインイン画面が表示されます。

image 2

パスワード入力後、追加の要素である Okta Verify による2段階認証を行うことでログインできます。

image 3

ユーザーの作成

検証用にここでは以下のコマンドでユーザーを作成しておきました。

USE ROLE USERADMIN;

CREATE USER user1 
    LOGIN_NAME = '<OktaのNameIDと一致する値>'
    PASSWORD='<パスワード>'
    DEFAULT_ROLE = public
    TYPE = PERSON;

TYPE 属性は、2024年7月のアップデートで追加された項目になります。これによりユーザーをサービスユーザーと明確に区別できるようになります。ここでは MFA の検証を行いたいのでPERSON に設定しました。こちらの詳細は以下をご参照ください。

https://dev.classmethod.jp/articles/snowflake-user-type-property/

認証ポリシーの作成

アクセス制御

認証ポリシーはスキーマレベルのオブジェクトのため、作成にはスキーマレベルのCREATE AUTHENTICATION POLICY 権限が必要です。ここでは以下の手順でポリシー作成用のデータベース、ポリシー管理用のロール(policy_admin)を作成しました。

--データベース作成
USE ROLE SYSADMIN;
----ポリシー管理用DB
CREATE REPLACE DATABASE governance;
CREATE SCHEMA governance.auth_policies;

--ロール作成
USE ROLE USERADMIN;
----policy管理者ロール
CREATE OR REPLACE ROLE policy_admin;

--権限付与
USE ROLE SECURITYADMIN;
----policy管理者ロール:スキーマレベルのCREATE AUTHENTICATION POLICY権限を与える
GRANT CREATE AUTHENTICATION POLICY ON SCHEMA governance.auth_policies TO ROLE policy_admin;
GRANT USAGE ON DATABASE governance TO ROLE policy_admin;
GRANT USAGE ON SCHEMA governance.auth_policies TO ROLE policy_admin;

--ロール階層
GRANT ROLE policy_admin TO ROLE SYSADMIN;
SHOW GRANTS TO ROLE policy_admin;

認証ポリシーのパラメータ

認証ポリシーの作成には以下のコマンドを使用します。

CREATE [ OR REPLACE ] AUTHENTICATION POLICY [ IF NOT EXISTS ] <name>
  [ AUTHENTICATION_METHODS = ( '<string_literal>' [ , '<string_literal>' , ...  ] ) ]
  [ MFA_AUTHENTICATION_METHODS = ( '<string_literal>' [ , '<string_literal>' , ...  ] ) ]
  [ MFA_ENROLLMENT = { REQUIRED | OPTIONAL } ]
  [ CLIENT_TYPES = ( '<string_literal>' [ , '<string_literal>' , ...  ] ) ]
  [ SECURITY_INTEGRATIONS = ( '<string_literal>' [ , '<string_literal>' , ... ] ) ]
  [ COMMENT = '<string_literal>' ]

主なパラメータの概要は以下の通りです。

  • AUTHENTICATION_METHODS
    • SAML, PASSWORD ,KEYPAIR ,OAUTHなどログイン時に許可される認証方法のリストを指定します
  • CLIENT_TYPES
    • SNOWFLAKE_UI ,DRIVERS,SNOWSQL など Snowflake への認証に使用可能なクライアントのリストを指定します
  • SECURITY_INTEGRATIONS
    • 認証方法としてSAMLまたは OAUTHが含まれる場合に、関連するセキュリティ統合オブジェクトを指定します

認証ポリシーはアカウント・ユーザーレベルで設定できるので、これらのオプションにより、アカウントやユーザーが使用可能な認証方法やクライアントを限定しセキュリティレベルを高めることが可能です。ユーザーレベルの認証ポリシーは、アカウントレベルのポリシーよりも優先されます。

https://docs.snowflake.com/en/sql-reference/sql/create-authentication-policy

認証ポリシーのMFAに関するパラメータ

また、認証ポリシーにはさらに MFA に関する以下のオプションが用意されています。

  • MFA_AUTHENTICATION_METHODS
    • SAML またはPASSWORD のいずれか、または両方を指定可能
      • デフォルト:('PASSWORD', 'SAML')
    • 認証方法(AUTHENTICATION_METHODS)としてSAML またはPASSWORD を指定した場合に有効で、各認証方法でのログイン時に MFA が適用されるかを指定できる
  • MFA_ENROLLMENT
    • ユーザーに MFA への登録を強制するかを制御できる
    • REQUIRED (強制する)またはOPTIONAL のいずれかを指定可能
      • デフォルト:OPTIONAL

これらのオプションにより、MFA の適用・登録の強制が可能です。ポイントとして、ここでの MFA とは Snowflake に統合済みの機能として提供される Duo Security サービスを指します。

https://docs.snowflake.com/ja/user-guide/security-mfa

ポリシーの作成例

上記の構成で例えば以下のようにポリシーを定義できます。

--ポリシー定義用ロールに切り替え
USE ROLE policy_admin;

--ポリシー定義
USE SCHEMA governance.auth_policies;

CREATE OR REPLACE AUTHENTICATION POLICY mfa_idp
 CLIENT_TYPES = ('SNOWFLAKE_UI')
 AUTHENTICATION_METHODS = ('SAML')
 SECURITY_INTEGRATIONS = ('OKTAINTEGRATION')
 MFA_AUTHENTICATION_METHODS = ('SAML');

このポリシーをユーザーに適用するとそのユーザーは Snowflake の UI への SAML によるログインのみが許可されます。 MFA_AUTHENTICATION_METHODS = ('SAML') としているので、ユーザーが Snowflake 統合済みの MFA 機能に登録している場合は、さらに Duo による MFA 認証が適用されます。(登録していない場合は適用されない)

MFA_ENROLLMENT

パラメータのMFA_ENROLLMENT'REQUIRED' としてポリシーを作成すると、ユーザーに Duo による MFA への登録を強制するかを制御できます。例として以下のようなポリシーをユーザーに適用します。

CREATE OR REPLACE AUTHENTICATION POLICY mfa_idp
 AUTHENTICATION_METHODS = ('SAML')
 SECURITY_INTEGRATIONS = ('OKTAINTEGRATION')
 MFA_AUTHENTICATION_METHODS = ('SAML')
 MFA_ENROLLMENT = 'REQUIRED';

ユーザーが Duo サービスによる Snowflake の MFA に未登録の場合、Snowflake にログイン時に下図のような表示となります。

image 4

Double MFA

認証ポリシーの設定により、ユーザーに対して Idp 側の MFA と Snowflake 組み込みの MFA(Duo)の両方を適用させることも可能です。ACCOUNTADMIN や SECURITYADMIN など強力な権限操作が可能なユーザーに適用することで、認証時のセキュリティ設定をさらに強化できます。

ポリシーの作成と適用

--ポリシー定義用ロールに切り替え
USE ROLE policy_admin;

--ポリシー定義
USE SCHEMA governance.auth_policies;

CREATE OR REPLACE AUTHENTICATION POLICY double_mfa
 AUTHENTICATION_METHODS = ('PASSWORD', 'SAML')
 SECURITY_INTEGRATIONS = ('OKTAINTEGRATION')
 MFA_AUTHENTICATION_METHODS = ('PASSWORD', 'SAML')
 MFA_ENROLLMENT = 'REQUIRED';

--userにポリシーを適用
USE ROLE ACCOUNTADMIN;
USE SCHEMA governance.auth_policies;
ALTER USER user1 SET AUTHENTICATION POLICY double_mfa;

上記のポリシーを適用したユーザーで Snowflake にログインしてみます。

Snowflakeのユーザー名・パスワードでログイン

AUTHENTICATION_METHODS としてパスワードも許可しているので通常のユーザー名・パスワードでのログインも可能です。

image 5

MFA_AUTHENTICATION_METHODS にパスワードを指定しているので Duo による MFA が適用されます。

image 6

SAMLでログイン

SAML でログインします。

image 7

ここでは下図の表示となるので Okta 側の認証情報を指定します。

image 8

続けて Okta 側の認証ポリシーに従い追加の認証が適用されます。

image 9

さらにMFA_AUTHENTICATION_METHODS に SAML を指定しているので Duo による MFA が適用されます。

image 10

これによりログインできます。

image 11

上記の例だと認証時のセキュリティレベルは向上しますが煩雑な場合もあるので、特定のユーザーにのみ適用するなど設定範囲も制御するのがよいと思います。
いずれかの MFA のみ適用されればよい場合は、以下の設定になります。

CREATE OR REPLACE AUTHENTICATION POLICY double_mfa
 AUTHENTICATION_METHODS = ('PASSWORD', 'SAML')
 SECURITY_INTEGRATIONS = ('OKTAINTEGRATION')
 MFA_AUTHENTICATION_METHODS = ('PASSWORD')
 MFA_ENROLLMENT = 'REQUIRED';

このポリシーは以下の設定となります。

  • 適用されたユーザーに対する Snowflake 組み込みのユーザー名・パスワード、SAML によるログインを許可
  • Snowflake 組み込みのユーザー名・パスワードによるログイン時のみ Duo による MFA を適用
    • SAML の場合は、IdP 側のポリシーに基づく
  • ユーザーが Snowflake 組み込みの MFA に登録していない場合は、登録を強制する

さいごに

Snowflake の認証ポリシーに追加された MFA に関するパラメータを試してみました。ユーザーの権限レベルに応じてどの範囲まで MFA を適用させるか制御できるので既存のオプションとあわせて使っていければと思いました。
こちらの内容が何かの参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.